package com.cskaoyan.javase.exception._0introduction;

/**
 * @description: java异常的体系引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 异常，即是程序运行出现了不正常的情况，报错，并导致程序终止
 * 要和编译失败,编译报错区分开
 *
 * Throwable（祖先类）
 * - Error
 *  描述是严重问题,一般不应该由程序抛出它并解决它,而需要一些额外的操作,
 *      错误不是这个章节讨论的问题,我们仅仅做一个了解即可
 *
 * - Exception
 *   - RuntimeException 运行时异常
 *      运行时异常在程序编译时期不会对程序有明显影响,只有在程序运行时期才可能被抛出,才可能会产生
 *      比如ArrayIndexOutOfBoundsException,NullPointerException,ArithmeticException等
 *      包括RuntimeException和它的子类,都是运行时异常
 *
 *   - 非RuntimeException 编译时异常
 *      编译时异常指的是在程序的编译时期必须显式的处理它,程序才能通过编译的异常
 *      比如CloneNotSupportedException
 *      在java中,所有Exception的子类,除了RuntimeException和RuntimeException的子类,都是编译时异常
 *
 * 注意事项:
 *      1.Exception是运行时异常,还是编译时异常?
 *          在继承层次上来说,它是java编译时异常和运行时异常的父类
 *          但是从使用上来讲,在java代码中它作为一个编译时异常被使用(如果程序中直接有Exception需要编译时期处理它)
 *          并且在自定义异常时,Exception是作为编译时异常的父类而存在的,所有直接继承Exception的类都是编译时异常
 *
 *
 *      2.因为编译时异常需要在编译时期检查并处理它,所以很多时候也叫它受检查的异常(checked exception),相对的,运行时异常就不需要检查,称之为不受检查异常(unchecked Exception)
 *
 *      3.如果把所有异常都设计成编译时异常,那样在程序编译时期就都能够警示程序员避免产生异常
 *      > Java设计异常体系的原则
 * 尽量把一切错误，摒弃在程序运行之前，最好在编译时期就发现程序潜在的问题（通过编译器）
 *      确实，Java把相当一部分异常定义为编译时异常，让程序员在编译时期就显式的处理它们
    但仍然有很多问题，必须要Java程序运行起来，才可能产生，被发现，是编译器检查不到的
 *      这就是运行时异常
 *
 *      4.异常的产生更多的是代码的书写有问题,尤其是运行时异常,如果程序出现了异常,固然可以通过捕获让程序不再抛出异常,但这不是常规手段.更重要的是检查代码,修正问题,让程序不再抛出异常
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        Demo d = new Demo();
        //Unhandled exception: java.lang.CloneNotSupportedException
        //d.clone();
        d = null;
        //System.out.println(d.toString());
        //System.out.println(10/0);
    }
}
